﻿using System;
using System.Configuration;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GanagroLiteData;
using Csla.Validation;

namespace GanagroLiteBO
{
    public partial class VentaBO : Operacion_BO, IEditableObject, INotifyPropertyChanged, IDataErrorInfo, IOperacion
    {
        #region private fields
        GANADO_BO _currentGanado;
        #endregion

        #region public properties

        private short? _Peso;

        public short? Peso
        {
            get { return _Peso; }
            set
            {
                if (_Peso != value)
                {
                    _Peso = value;
                    FirePropertyChangedNotification("Peso");
                }
            }
        }


        #endregion

        public Int32 ValorKilo { get; set; }

        #region constructors

        public VentaBO(List<string> contenedor, OpArgs opArgs, NotaBO nota)
        {
            this.OPERACION = (short)TiposOperacion.venta;
            this.Contenedor = contenedor;
            this.FECHA = nota.Fecha;
            this.Nota = nota.Nota;
            this.ValorKilo = opArgs.ValorKilo;

            AddAdtlBusinessRules();

            this.Peso = 0;

        }

        public VentaBO(PESAJES_BO pbo, Int32 precioKilo) : base(true)
        {

            this.OPERACION = (short)TiposOperacion.venta;
            this.CODIGO = pbo.CODIGO;
            this.FECHA = pbo.FECHA;
            this.Peso = pbo.Peso;
            this.VALOR2 = precioKilo;

            base.AddBusinessRules();
            AddAdtlBusinessRules();
        }

        #endregion

        #region Methods

        new public void Guardar()
        {
            if (!this.IsValid())
            {
                return;
            }

            _currentGanado = new GANADO_BO(CODIGO);
            _currentGanado.Activo = 0;
            _currentGanado.FECHASAL = this.FECHA;
            _currentGanado.TIPOSALIDA = (byte)TiposOperacion.venta;
            _currentGanado.Guardar();

            this.VALOR1 = Peso;

            PESAJES_BO _pesajesBO = new PESAJES_BO();
            _pesajesBO.CODIGO = this.CODIGO;
            _pesajesBO.FECHA = this.FECHA;
            _pesajesBO.OPERACION = (short)TiposOperacion.venta;
            _pesajesBO.Peso = (short)this.Peso;
            _pesajesBO.Guardar();

            // guardar en tabla de operaciones
            base.Guardar();
        }

        #endregion

        #region Validation Rules

        private static bool ValidaPeso<T>(T target, Csla.Validation.RuleArgs e) where T : VentaBO
        {
            e.Description = string.Empty;

            if (((target.Peso ?? 0) > 600) || (target.Peso ?? 0) < 20) 
            {
                e.Description = "Peso debe estar entre 20 y 600 Kilos";
                return false;
            }

            return true;
        }

        private static bool ValidaCodigo<T>(T target, Csla.Validation.RuleArgs e) where T : VentaBO
        {
            string message = string.Empty;
            bool success = true;


            if (utilities.CodigoEsValido(target._CODIGO, ref message, TiposOperacion.venta) == false)
            {
                e.Description = message;
                success = false;
            }

            return success;
        }

        protected void AddAdtlBusinessRules()
        {
            try
            {
                ValidationRules.AddRule(new Csla.Validation.RuleHandler<VentaBO, RuleArgs>(ValidaCodigo), "CODIGO",0);
                ValidationRules.AddRule(new Csla.Validation.RuleHandler<VentaBO, RuleArgs>(ValidaPeso), "Peso",1);
            }
            catch (Exception ex)
            {
                throw (new Exception("AddAdtlBusinessRules: " + ex.Message, ex));
            }
        }

        #endregion

    }

    public class Ventas : BindingListView<VentaBO> 
    {

        public void Setfecha(DateTime fecha)
        {
            foreach (VentaBO item in this)
            {
                item.FECHA = fecha.Date;
                item.IsValid();
            }
        }

        public void SetPrecio(short precio)
        {
            foreach (VentaBO item in this)
            {
                item.VALOR2 = precio;
                item.ValorKilo = precio;
            }
        }

    }

}
